<!DOCTYPE html>
<html>
	<head>
		<!-- 定义：原型对象是函数的  函数的prototype属性指向原型对象 语法：类名.prototype-->
		<!-- 作用：为类中的所有对象添加属性（方法） -->
		<meta charset="utf-8">
		<title>prototype</title>
		<script type="text/javascript">
			function f1(){
				// 这里的f1.prototype就是原型对象  
				console.log(f1.prototype)
			}
			function F1(){
				// // 这里的F1.prototype F1函数的就是原型对象  
				  console.log(F1.prototype)
			}

			f1();
			F1();
			// 向原型对象中添加属性
			 F1.prototype.name="原型对象中的名字";
			 F1.prototype.sayHello=function(){
				 // 因为前面定义
				 console.log(this.name)
			 };
			//  使用new关键字创建对象时，会调用构造函数
	            var p1=new F1();
			    console.log(p1.__proto__.hasOwnProperty("constructor")) 
			    console.log(p1.__proto__.hasOwnProperty("hasOwnProperty")) 
			 // 对象中有,就不会去原型中找了.
			 p1.name="p1中的name";
			 console.log(p1.constructor)
			 p1.sayHello()
			 console.log(p1.name)
			 var p2=new F1();
			  console.log(p2.name)
			 f1();
			//  每个函数的原型对象都不同  函数的原型对象使用prototype,实例使用__proto__
			 console.log(F1.prototype==f1.prototype)
			console.log(p1.__proto__);
				console.log(p1.__proto__==p2.__proto__);
			 console.log(F1.prototype==p1.__proto__)
			 
			 console.log(typeof(p1.__proto__))
			 var p2=new F1();
		</script>
	</head>
	<body>
	</body>
</html>
<!-- 		我们每创建一个函数时。解析器回味构造器创建一个原型对象。是独立存在的
         解析器都会给函数（对象）添加一个属性prototype,这个属性对应着唯一对象，
		这个对象就是原型对象。同样原型对象中有一个constructor属性指向构造器（函数首地址）
		，是对象就有构造器，是对象就有首地址，prototype保存原型对象的首地址。
		
		当函数使用构造函数调用时，
		它所创建的对象会有一个隐含属性指向该构造函数的原型对象，
		通过使用__proto__来访问该属性。原型对象就是类中的公用区域，
		所有对象都拥有原型对象中拥有的属性。就是我们访问一个对象的属性时，
		他会首先在自己的属性中找，如果有直接使用，不再寻找。找不到去原型对象中找
		，直到原型为object。所以创建构造函数时，将对象共有的属性与方法写原型对象中 -->